package com.chapter15.demo1;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 要使用Java的动态代理机制，需要编写一个类实现InvocationHandler接口，
 * 然后调用Proxy类的静态方法newProxyInstance创建一个代理类的实例，
 * 之后程序中使用这个实例调用接口中的方法。
 * 附加的动作在处理器的invoke方法中添加。
 */
public class LogHandler implements InvocationHandler {
    Logger logger = Logger.getLogger(this.getClass().getName());
    private Object originalObj;

    public Object bind(Object object){
        this.originalObj=object;
        return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(),originalObj.getClass().getInterfaces(),this);
    }

    //InvocationHandler的invoke方法将在被代理类实例的方法调用之前触发
    //InvocationHandler的invoke方法会传入被代理对象的方法对应的Method对象与方法参数，
    // 实际执行的方法交由method.invoke（originalObj， args），
    // 我们在其调用前后加上记录动作，method.invoke方法调用传回的对象是实际方法执行后的返回结果。
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        logger.log(Level.INFO,"method start ..."+ method);
        result=method.invoke(originalObj,args);
        logger.log(Level.INFO,"method end... "+ method);

        return result;
    }
}
